package Java2Test.Reflect.Reflect3;

import java.lang.reflect.Field;

public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {

        // 通过全类名获取Student类的Class对象
        Class<?> clazz = Class.forName("Java2Test.Reflect.Reflect3.Student");

        // 获取所有声明的字段（包括私有、受保护和公共字段）
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField); // 输出字段的完整签名
        }

        // 获取指定名称的字段（这里获取name字段）
        Field name = clazz.getDeclaredField("name");
        System.out.println(name); // 输出字段的完整签名

        // 获取字段的修饰符（返回值为整数，可通过Modifier类解析）
        int modifiers = name.getModifiers();
        System.out.println(modifiers); // 例如：1表示public，2表示private

        // 获取字段的名称
        String name1 = name.getName();
        System.out.println(name1); // 输出：name

        // 获取字段的类型
        Class<?> type = name.getType();
        System.out.println(type); // 输出：class java.lang.String

        // 创建Student对象实例
        Student s = new Student("zhangsan", 23, "nan");

        // 暴力反射：突破访问限制，允许访问私有字段,否则无法取值也无法设置值
        name.setAccessible(true);

        // 获取指定对象上此Field表示的字段的值
        String s1 = (String) name.get(s);
        System.out.println(s1); // 输出：zhangsan

        // 设置指定对象上此Field表示的字段的值
        name.set(s, "lisi");
        System.out.println(s); // 输出修改后的对象信息
    }
}